Author(s): Shuwen Cheng; Yasi Zhang
Reviewer(s): Ying Ge
Date: r Sys.Date()

Academic Citation

If you use this code in your work or research, we kindly request that you cite our publication:

Xiaofan Lu, et al. (2025). FigureYa: A Standardized Visualization Framework for Enhancing Biomedical Data Interpretation and Research Efficiency. iMetaMed. https://doi.org/10.1002/imm3.70005

需求描述

Demand description

画出CNV的这个图。

Draw this CNV plot.

出自:https://molecular-cancer.biomedcentral.com/articles/10.1186/s12943-021-01322-w,跟FigureYa259circLink和FigureYa262GDC出自同一篇文章。

图1. CRC中RNA修饰“书写器”的遗传及转录改变。 c, 柱状图显示TCGA-COAD/READ队列中RNA修饰“书写器”的CNV增益(红色)、缺失(蓝色)和非CNV(绿色)的频率。每根柱子的高度代表改变频率。

Source: https://molecular-cancer.biomedcentral.com/articles/10.1186/s12943-021-01322-w, it is from the same article as FigureYa259circLink and FigureYa262GDC.

Fig. 1 Genetic and transcriptional alterations of RNA modification “writers” in CRC. c, Bar graphs showing the frequency of CNV gain (red), loss (blue) and non_CNV (green) of RNA modification “writers” in the TCGA-COAD/READ cohort. The height of each bar represents the alteration frequency.

应用场景

Application scenarios

外显子测序数据可以画这样的图。

RNA-seq数据也可以借助这样的分析来深挖。例如RNA-seq筛出成百上千个差异基因,谁才是关键基因?它通过什么方式影响了下游基因的表达?或许是某些基因发生了高频copy number variation(gain/loss)。

Exome sequencing data can generate similar plots.

RNA-seq data can also be leveraged for in-depth analysis using such approaches. For example, when RNA-seq identifies hundreds or thousands of differentially expressed genes, how can we pinpoint the key drivers? By what mechanisms do they regulate downstream gene expression? One possible explanation could be high-frequency copy number variations (gain/loss) in certain genes.

环境设置

Environment Setup

source("install_dependencies.R")
## Starting R package installation...
## ===========================================
## 
## Installing CRAN packages...
## Package already installed: magrittr 
## Package already installed: tidyverse 
## 
## Installing Bioconductor packages...
## Package already installed: SummarizedExperiment 
## Package already installed: TCGAbiolinks 
## Package already installed: clusterProfiler 
## Package already installed: org.Hs.eg.db 
## 
## ===========================================
## Package installation completed!
## You can now run your R scripts in this directory.
library(magrittr)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.2
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::extract()   masks magrittr::extract()
## ✖ dplyr::filter()    masks stats::filter()
## ✖ dplyr::lag()       masks stats::lag()
## ✖ purrr::set_names() masks magrittr::set_names()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(org.Hs.eg.db)
## Loading required package: AnnotationDbi
## Loading required package: stats4
## Loading required package: BiocGenerics
## Loading required package: generics
## 
## Attaching package: 'generics'
## 
## The following object is masked from 'package:lubridate':
## 
##     as.difftime
## 
## The following object is masked from 'package:dplyr':
## 
##     explain
## 
## The following objects are masked from 'package:base':
## 
##     as.difftime, as.factor, as.ordered, intersect, is.element, setdiff,
##     setequal, union
## 
## 
## Attaching package: 'BiocGenerics'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
## 
## The following objects are masked from 'package:stats':
## 
##     IQR, mad, sd, var, xtabs
## 
## The following objects are masked from 'package:base':
## 
##     anyDuplicated, aperm, append, as.data.frame, basename, cbind,
##     colnames, dirname, do.call, duplicated, eval, evalq, Filter, Find,
##     get, grep, grepl, is.unsorted, lapply, Map, mapply, match, mget,
##     order, paste, pmax, pmax.int, pmin, pmin.int, Position, rank,
##     rbind, Reduce, rownames, sapply, saveRDS, table, tapply, unique,
##     unsplit, which.max, which.min
## 
## Loading required package: Biobase
## Welcome to Bioconductor
## 
##     Vignettes contain introductory material; view with
##     'browseVignettes()'. To cite Bioconductor, see
##     'citation("Biobase")', and for packages 'citation("pkgname")'.
## 
## Loading required package: IRanges
## Loading required package: S4Vectors
## 
## Attaching package: 'S4Vectors'
## 
## The following objects are masked from 'package:lubridate':
## 
##     second, second<-
## 
## The following objects are masked from 'package:dplyr':
## 
##     first, rename
## 
## The following object is masked from 'package:tidyr':
## 
##     expand
## 
## The following object is masked from 'package:utils':
## 
##     findMatches
## 
## The following objects are masked from 'package:base':
## 
##     expand.grid, I, unname
## 
## 
## Attaching package: 'IRanges'
## 
## The following object is masked from 'package:lubridate':
## 
##     %within%
## 
## The following objects are masked from 'package:dplyr':
## 
##     collapse, desc, slice
## 
## The following object is masked from 'package:purrr':
## 
##     reduce
## 
## 
## Attaching package: 'AnnotationDbi'
## 
## The following object is masked from 'package:dplyr':
## 
##     select
library(TCGAbiolinks)
library(clusterProfiler)
## 
## clusterProfiler v4.16.0 Learn more at https://yulab-smu.top/contribution-knowledge-mining/
## 
## Please cite:
## 
## Guangchuang Yu, Li-Gen Wang, Yanyan Han and Qing-Yu He.
## clusterProfiler: an R package for comparing biological themes among
## gene clusters. OMICS: A Journal of Integrative Biology. 2012,
## 16(5):284-287
## 
## Attaching package: 'clusterProfiler'
## 
## The following object is masked from 'package:AnnotationDbi':
## 
##     select
## 
## The following object is masked from 'package:IRanges':
## 
##     slice
## 
## The following object is masked from 'package:S4Vectors':
## 
##     rename
## 
## The following object is masked from 'package:purrr':
## 
##     simplify
## 
## The following object is masked from 'package:stats':
## 
##     filter
library(SummarizedExperiment)
## Loading required package: MatrixGenerics
## Loading required package: matrixStats
## 
## Attaching package: 'matrixStats'
## 
## The following objects are masked from 'package:Biobase':
## 
##     anyMissing, rowMedians
## 
## The following object is masked from 'package:dplyr':
## 
##     count
## 
## 
## Attaching package: 'MatrixGenerics'
## 
## The following objects are masked from 'package:matrixStats':
## 
##     colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
##     colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
##     colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
##     colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
##     colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
##     colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
##     colWeightedMeans, colWeightedMedians, colWeightedSds,
##     colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
##     rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
##     rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
##     rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
##     rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
##     rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
##     rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
##     rowWeightedSds, rowWeightedVars
## 
## The following object is masked from 'package:Biobase':
## 
##     rowMedians
## 
## Loading required package: GenomicRanges
## Loading required package: GenomeInfoDb
## 
## Attaching package: 'GenomicRanges'
## 
## The following object is masked from 'package:magrittr':
## 
##     subtract
# 显示英文报错信息
# Show English error messages
Sys.setenv(LANGUAGE = "en") 

# 禁止chr转成factor
# Prevent character-to-factor conversion
options(stringsAsFactors = FALSE) 

输入数据

Input Files

从GDC下载hg38的CNV数据,以COAD/READ为例。

easy_input_gene.txt,要看哪些基因的CNV,就写到这个文件里。甚至可以把所有差异基因或参与某个通路的基因都拿来计算,查看输出文件output_cnv.csv。然后筛选gain或loss频率高的前十几个基因,进行画图展示。

Download hg38 CNV data from GDC, using COAD/READ as an example.

The file easy_input_gene.txt should contain the list of genes for CNV analysis. You may include all differentially expressed genes or pathway-related genes for calculation, then check the output file output_cnv.csv. Subsequently, select the top ~10 genes with high-frequency gains or losses for visualization.

# 查询并下载TCGA-COAD拷贝数变异数据
# Query and download TCGA-COAD copy number variation data
cnv_COAD <- GDCquery(
  project = "TCGA-COAD",  
  data.category = "Copy Number Variation",
  data.type = "Gene Level Copy Number",
  access = "open",
  workflow.type = "ASCAT3",
  experimental.strategy = "Genotyping Array"
) %T>%
  GDCdownload %>% GDCprepare
## --------------------------------------
## o GDCquery: Searching in GDC database
## --------------------------------------
## Genome of reference: hg38
## --------------------------------------------
## oo Accessing GDC. This might take a while...
## --------------------------------------------
## ooo Project: TCGA-COAD
## --------------------
## oo Filtering results
## --------------------
## ooo By access
## ooo By experimental.strategy
## ooo By data.type
## ooo By workflow.type
## ----------------
## oo Checking data
## ----------------
## ooo Checking if there are duplicated cases
## ooo Checking if there are results for the query
## -------------------
## o Preparing output
## -------------------
## Downloading data for project TCGA-COAD
## Of the 422 files for download 422 already exist.
## All samples have been already downloaded
## Reading Gene Level Copy Number files
## Creating a SummarizedExperiment object
## Starting to add information to samples
##  => Add clinical information to samples
##  => Adding TCGA molecular information from marker papers
##  => Information will have prefix 'paper_'
## coad subtype information from:doi:10.1038/nature11252
## Available assays in SummarizedExperiment : 
##   => copy_number
##   => min_copy_number
##   => max_copy_number
dim(cnv_COAD)
## [1] 60623   422
# 查询并下载TCGA-READ拷贝数变异数据
# Query and download TCGA-READ copy number variation data
cnv_READ <- GDCquery(project = "TCGA-READ",  
  data.category = "Copy Number Variation",
  data.type = "Gene Level Copy Number",
  access = "open",
  workflow.type = "ASCAT3",
  experimental.strategy = "Genotyping Array"
) %T>%
  GDCdownload %>% GDCprepare
## --------------------------------------
## o GDCquery: Searching in GDC database
## --------------------------------------
## Genome of reference: hg38
## --------------------------------------------
## oo Accessing GDC. This might take a while...
## --------------------------------------------
## ooo Project: TCGA-READ
## --------------------
## oo Filtering results
## --------------------
## ooo By access
## ooo By experimental.strategy
## ooo By data.type
## ooo By workflow.type
## ----------------
## oo Checking data
## ----------------
## ooo Checking if there are duplicated cases
## ooo Checking if there are results for the query
## -------------------
## o Preparing output
## -------------------
## Downloading data for project TCGA-READ
## Of the 153 files for download 153 already exist.
## All samples have been already downloaded
## Reading Gene Level Copy Number files
## Creating a SummarizedExperiment object
## Starting to add information to samples
##  => Add clinical information to samples
##  => Adding TCGA molecular information from marker papers
##  => Information will have prefix 'paper_'
## read subtype information from:doi:10.1038/nature11252
## Available assays in SummarizedExperiment : 
##   => copy_number
##   => min_copy_number
##   => max_copy_number
dim(cnv_READ)
## [1] 60623   153
# 提取拷贝数数据
# Extract copy number data
cnv_COAD_data <- assay(cnv_COAD, "copy_number")
cnv_READ_data <- assay(cnv_READ, "copy_number")

# 合并COAD和READ数据
# Merge COAD and READ data
cnv_data <- cbind(cnv_COAD_data, cnv_READ_data)

# 统一colData
# Harmonize colData
common_cols <- intersect(colnames(colData(cnv_COAD)), colnames(colData(cnv_READ)))
colData_COAD <- colData(cnv_COAD)[, common_cols]
colData_READ <- colData(cnv_READ)[, common_cols]
combined_colData <- rbind(colData_COAD, colData_READ)

# 重建 SummarizedExperiment
# Reconstruct SummarizedExperiment
cnv <- SummarizedExperiment(
  assays = list(copy_number = cnv_data),
  colData = combined_colData,
  rowData = rowData(cnv_COAD)
)

# 检查合并结果
# Check merging results
dim(cnv)
## [1] 60623   575
# 删除重复的sample
# Remove duplicate samples
cnv <- cnv[,!duplicated(colnames(cnv))]
dim(cnv)
## [1] 60623   575
# Define a gene set of interest
# 定义感兴趣的基因集

## 方法1:从文件读取
## Option 1: Read from file
genes <- read.table("easy_input_gene.txt", header = T)$SYMBOL

## 方法2:直接指定基因
## Option 2: Directly specify genes (commented out example)
#genes <- c("METTL3", "METTL14", "FTO", "ALKBH5","IGF2BP3",
#           "YTHDF1", "YTHDF2", "YTHDF3", "IGF2BP1", "IGF2BP2", )

计算gain和loss频率

Calculate gain and loss frequency

# 将CNV数据转换为数据框并处理基因符号
# Convert CNV data to dataframe and process gene symbols 
cnv_df <- as.data.frame(assay(cnv, "copy_number")) %>%
  rownames_to_column("Gene_Symbol")

# CNV数据处理流程
# Process CNV data    
cnv2 <- cnv_df %>%
  
  # 提取ENSEMBL ID(取前15位字符)  
  # Extract ENSEMBL IDs (first 15 characters)  
  mutate(ENSEMBL = str_sub(Gene_Symbol, 1, 15)) %>%
  
  # 转换为基因名SYMBOL
  # Convert to gene symbols
  inner_join(bitr(.$ENSEMBL,
                  fromType = "ENSEMBL",
                  toType = "SYMBOL",
                  OrgDb = org.Hs.eg.db)) %>% 
  
  # 去除转换时可能产生的重复项
  # Remove potential duplicates after conversion
  distinct(SYMBOL, .keep_all = TRUE) %>% 
  
  # 仅保留目的基因
  # Filter for target genes
  filter(SYMBOL %in% genes) %>% 
  
  # 将SYMBOL作为行名
  # SYMBOL is used as rownames
  column_to_rownames("SYMBOL") %>% 
  
  # 移除注释信息列  
  # Remove metadata columns  
  dplyr::select(-ENSEMBL, -Gene_Symbol) %>% 
  
  # 筛选肿瘤样本(TCGA编号第14-15位<10)  
  # Filter tumor samples (TCGA barcode positions 14-15 < 10)  
  select_if(str_sub(colnames(.), 14, 15) < 10) %>% 
  
  # 计算CNV频率(基于ASCAT3的整数拷贝数)
  # Calculate CNV frequencies (based on ASCAT3-derived integer copy number values)
    mutate(
    CNV_loss = rowMeans(.< 2, na.rm = TRUE),   
    CNV_gain = rowMeans(.> 2, na.rm = TRUE),   
    CNV_normal = rowMeans(. == 2, na.rm = TRUE)  
  ) %>% 
 
  # 仅保留频率指标
  # Keep only frequency metrics  
  dplyr::select(CNV_loss, CNV_gain, CNV_normal) %>% 
  
  # 恢复基因名列  
  # Restore gene symbols column  
  rownames_to_column("gene") %>% 
  
  # 将数据转变为长数据,便于绘图
  # Convert to long format for plotting  
  pivot_longer(!gene, names_to = "Group", values_to = "pct") %>% 
  
  # 转换为百分比
  # Convert to percentage
  mutate(pct = pct * 100)
## 'select()' returned 1:many mapping between keys and columns
## Warning in bitr(.$ENSEMBL, fromType = "ENSEMBL", toType = "SYMBOL", OrgDb =
## org.Hs.eg.db): 39.48% of input gene IDs are fail to map...
## Joining with `by = join_by(ENSEMBL)`
## Warning in inner_join(., bitr(.$ENSEMBL, fromType = "ENSEMBL", toType = "SYMBOL", : Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 9 of `x` matches multiple rows in `y`.
## ℹ Row 37928 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
# 保存处理结果  
# Save processed data  
write.csv(cnv2, "output_cnv.csv", row.names = F, quote = F)

开始画图

Plotting

# 选项1:使用easy_input_gene.txt中预定义的顺序
# Option 1: Use predefined order from easy_input_gene.txt
#cnv2$gene <- factor(cnv2$gene, levels = genes)

# 选项2:按CNV扩增频率降序排序
# Option 2: Sort by CNV gain frequency (descending)
cnv2_gain <- cnv2[cnv2$Group == "CNV_gain",]
cnv2_gain_sorted <- cnv2_gain[order(cnv2_gain$pct, decreasing = T),] 
cnv2$gene <- factor(cnv2$gene, levels = cnv2_gain_sorted$gene)


# 设置条形图堆叠顺序
# Set bar plot order
cnv2$Group <- factor(cnv2$Group, levels = c("CNV_loss", "CNV_gain", "CNV_normal"))

# 生成堆积条形图
# Generate stacked bar plot
ggplot(cnv2, aes(x = gene, y = pct, fill = Group)) +
  
  # 绘制堆积条形图
  # Draw stacked bars
  geom_col(position = "stack") +
  
  # 添加标题
  # Add title
  ggtitle(paste0("TCGA-COAD/READ\nn=", ncol(cnv) - 3)) +
  
  # 手动添加颜色
  # Custom color scheme
  scale_fill_manual(values = c("steelblue3", "firebrick2",  "forestgreen")) +
  
  # 坐标轴标签
  # Axis labels
  xlab("m6A genes") +
  ylab("Frequency of group(%)") +
  
  theme_classic() +
  theme(axis.line = element_line(size = 1, lineend = "square"),
        axis.title = element_text(size = 15,face = "bold"),
        axis.text.y = element_text(size = 12,face = "bold"),
        axis.text.x = element_text(size = 12,face = "bold", angle = 90, hjust = 1),
        axis.ticks.length = unit(0.25,"cm"),
        axis.ticks = element_line(size = 1),
        legend.text = element_text(size = 12,face = "bold"),
        legend.title = element_text(size = 15,face = "bold")) 
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# 保存为PDF
# Save as PDF
ggsave("CNV.pdf", width = 6, height = 4)

我们算出的frequency跟原文差距较大,跟cBioPortal结果相近。跟原文作者联系,还没有回复。

The frequencies we calculated show significant discrepancies from those reported in the original paper, but align closely with results from cBioPortal. We have reached out to the original authors for clarification but have not yet received a response.

Session Info

sessionInfo()
## R version 4.5.1 (2025-06-13)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.04.3 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
## 
## locale:
##  [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8       
##  [4] LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
##  [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C          
## [10] LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   
## 
## time zone: UTC
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] SummarizedExperiment_1.38.1 GenomicRanges_1.60.0       
##  [3] GenomeInfoDb_1.44.2         MatrixGenerics_1.20.0      
##  [5] matrixStats_1.5.0           clusterProfiler_4.16.0     
##  [7] TCGAbiolinks_2.36.0         org.Hs.eg.db_3.21.0        
##  [9] AnnotationDbi_1.70.0        IRanges_2.42.0             
## [11] S4Vectors_0.46.0            Biobase_2.68.0             
## [13] BiocGenerics_0.54.0         generics_0.1.4             
## [15] lubridate_1.9.4             forcats_1.0.0              
## [17] stringr_1.5.2               dplyr_1.1.4                
## [19] purrr_1.1.0                 readr_2.1.5                
## [21] tidyr_1.3.1                 tibble_3.3.0               
## [23] ggplot2_4.0.0               tidyverse_2.0.0            
## [25] magrittr_2.0.4             
## 
## loaded via a namespace (and not attached):
##   [1] RColorBrewer_1.1-3          jsonlite_2.0.0             
##   [3] ggtangle_0.0.7              farver_2.1.2               
##   [5] rmarkdown_2.29              ragg_1.5.0                 
##   [7] fs_1.6.6                    vctrs_0.6.5                
##   [9] memoise_2.0.1               ggtree_3.16.3              
##  [11] htmltools_0.5.8.1           S4Arrays_1.8.1             
##  [13] progress_1.2.3              curl_7.0.0                 
##  [15] SparseArray_1.8.1           gridGraphics_0.5-1         
##  [17] sass_0.4.10                 bslib_0.9.0                
##  [19] plyr_1.8.9                  httr2_1.2.1                
##  [21] cachem_1.1.0                igraph_2.1.4               
##  [23] lifecycle_1.0.4             pkgconfig_2.0.3            
##  [25] gson_0.1.0                  Matrix_1.7-3               
##  [27] R6_2.6.1                    fastmap_1.2.0              
##  [29] GenomeInfoDbData_1.2.14     digest_0.6.37              
##  [31] aplot_0.2.9                 enrichplot_1.28.4          
##  [33] patchwork_1.3.2             ps_1.9.1                   
##  [35] textshaping_1.0.3           RSQLite_2.4.3              
##  [37] labeling_0.4.3              filelock_1.0.3             
##  [39] timechange_0.3.0            httr_1.4.7                 
##  [41] abind_1.4-8                 compiler_4.5.1             
##  [43] bit64_4.6.0-1               withr_3.0.2                
##  [45] downloader_0.4.1            S7_0.2.0                   
##  [47] BiocParallel_1.42.2         DBI_1.2.3                  
##  [49] R.utils_2.13.0              biomaRt_2.64.0             
##  [51] rappdirs_0.3.3              DelayedArray_0.34.1        
##  [53] tools_4.5.1                 chromote_0.5.1             
##  [55] ape_5.8-1                   R.oo_1.27.1                
##  [57] glue_1.8.0                  nlme_3.1-168               
##  [59] GOSemSim_2.34.0             promises_1.3.3             
##  [61] grid_4.5.1                  reshape2_1.4.4             
##  [63] fgsea_1.34.2                gtable_0.3.6               
##  [65] tzdb_0.5.0                  R.methodsS3_1.8.2          
##  [67] websocket_1.4.4             data.table_1.17.8          
##  [69] hms_1.1.3                   xml2_1.4.0                 
##  [71] XVector_0.48.0              ggrepel_0.9.6              
##  [73] pillar_1.11.1               vroom_1.6.6                
##  [75] yulab.utils_0.2.1           later_1.4.4                
##  [77] splines_4.5.1               treeio_1.32.0              
##  [79] BiocFileCache_2.16.2        lattice_0.22-7             
##  [81] bit_4.6.0                   tidyselect_1.2.1           
##  [83] GO.db_3.21.0                Biostrings_2.76.0          
##  [85] knitr_1.50                  xfun_0.53                  
##  [87] stringi_1.8.7               UCSC.utils_1.4.0           
##  [89] lazyeval_0.2.2              ggfun_0.2.0                
##  [91] yaml_2.3.10                 TCGAbiolinksGUI.data_1.28.0
##  [93] evaluate_1.0.5              codetools_0.2-20           
##  [95] qvalue_2.40.0               ggplotify_0.1.3            
##  [97] cli_3.6.5                   systemfonts_1.2.3          
##  [99] processx_3.8.6              jquerylib_0.1.4            
## [101] Rcpp_1.1.0                  dbplyr_2.5.1               
## [103] png_0.1-8                   XML_3.99-0.19              
## [105] parallel_4.5.1              blob_1.2.4                 
## [107] prettyunits_1.2.0           DOSE_4.2.0                 
## [109] tidytree_0.4.6              scales_1.4.0               
## [111] crayon_1.5.3                rlang_1.1.6                
## [113] cowplot_1.2.0               fastmatch_1.1-6            
## [115] KEGGREST_1.48.1             rvest_1.0.5